/**
 * \file   cmd.cpp
 * \author Fabian Jesus Machado
 * \date   Septiembre de 2011
 * 
 *  Este archivo es parte del proyecto NPASM, un ensamblador para
 * microcontroladores PIC con sintaxis Intel, desarrollado inicialmente
 * por Fabian Machado (fabianjsm@gmail.com, twitter@fabianjsm).
 *  El codigo fuente esta diponible en el repositorio SVN de Google:
 *      http://npasm.googlecode.com/svn/trunk.
 * 
 */
#include <string>
#include "cmd.h"
#include "sintaxis.h"
#include "auxiliar.h"
#include "entorno.h"

/** Esta funcion es amiga de la clase \a entorno */
void cmd_section(simbolo *sbl)
{
	if(sbl->GetTipo() != SECCION)
		throw(mkstring("'%s' no es una seccion", sbl->GetNombre().c_str()));
	Entorno->m->SetSeccion(sbl->ToUInt());
}

/** Esta funcion es amiga de la clase \a entorno */
void cmd_align(size_t _n)
{
	Entorno->m->Alinear(_n);
}

/** Esta funcion es amiga de la clase \a entorno */
void cmd_resx(size_t n, size_t k)
{
	if(Entorno->m->tipo == ROM)
		throw(std::string("no puede reservar memoria en seccion ROM"));
	Entorno->m->AvanzarP(n*k);
}

/** Familia de comandos dx (db, dw y dq) */
/** Esta funcion es amiga de la clase \a entorno */
void cmd_dx(unsigned long d, size_t k)
{
	if(Entorno->GetPaso() == 1)
		return;
	switch(k) {
	case 1:
		Entorno->m->SetROM(d & 0xFF);
		break;
	case 2:
		Entorno->m->SetROM(d & 0xFFFF);
		break;
	case 4:
		Entorno->m->SetROM((d>>16) & 0xFFFF);
		Entorno->m->SetROM(d & 0xFFFF);
		break;
	}
}
